//输入一个矩阵，按照从外向里以顺时针的顺序依次打印出每一个数字。 
//
// 
//
// 示例 1： 
//
// 输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
//输出：[1,2,3,6,9,8,7,4,5]
// 
//
// 示例 2： 
//
// 输入：matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
//输出：[1,2,3,4,8,12,11,10,9,5,6,7]
// 
//
// 
//
// 限制： 
//
// 
// 0 <= matrix.length <= 100 
// 0 <= matrix[i].length <= 100 
// 
//
// 注意：本题与主站 54 题相同：https://leetcode-cn.com/problems/spiral-matrix/ 
// Related Topics 数组 矩阵 模拟 👍 350 👎 0

package com.cute.leetcode.editor.cn;
public class ShunShiZhenDaYinJuZhenLcof {
    public static void main(String[] args) {
        Solution solution = new ShunShiZhenDaYinJuZhenLcof().new Solution();
    }
    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        /**
         * 又是这个螺旋矩阵的题目，这道题目不考算法，考的是边界条件
         * 剑指Offer的题解上的思路反而不是很直观
         */
        public int[] spiralOrder(int[][] matrix) {
            //注意空数组的情况
            int m = matrix.length;
            if (m == 0) return new int[0];
            int n = matrix[0].length;
            if (n == 0) return new int[0];
            int i = 0;
            int[] res = new int[m * n];
            //定义一个flag 1向右，2向下，-1向左，-2向上，初始向右
            int flag = 1;
            //定义四个边界，边界每次都全取到才行
            int left = 0;
            int right = n - 1;
            int top = 0;
            int down = m - 1;
            while (i < m * n){
                switch (flag){//每次只看一条边
                    case 1 : {
                        for (int j = left; j <= right; j++) res[i++] = matrix[top][j];//向右遍历
                        top++;//上边界 + 1
                        flag = 2;//标志置为向下
                        break;
                    }
                    case 2 : {
                        for (int j = top; j <= down; j++) res[i++] = matrix[j][right];//向下遍历
                        right--;// 右边界 - 1
                        flag = -1;// 下一步向左遍历
                        break;
                    }
                    case -1 : {
                        for (int j = right; j >= left ; j--) res[i++] = matrix[down][j];//向左遍历
                        down--;// 上边界 - 1
                        flag = -2;// 下一步向上
                        break;
                    }
                    case -2 : {
                        for (int j = down; j >= top; j--) res[i++] = matrix[j][left];//向上遍历
                        left++;// 左边界 + 1
                        flag = 1;// 下一步向右
                        break;
                    }
                }
            }
            return res;
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}